﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace QldtSdh.GUI.DaoTao
{
    using BLL;
    using DAL;
    using DAL.Models;
    using GUI.Utils;
    using QldtSdh.GUI.Common;
    using QldtSdh.Utils;

    public partial class UcQuanLyKeHoachDaoTao : QldtSdh.GUI.Common.BaseUserControl, QldtSdh.GUI.Common.IHocKyChangable
    {
        private bool _DoNotLoadDanhSachLopKhoaNganh = false;
        private bool _DoNotLoadDanhSachHocPhanDuKien = false;

        #region Các thuộc tính
        /// <summary>
        /// Học kỳ đang lập Kế hoạch đào tạo
        /// </summary>
        public DAL.Models.HocKy HocKy { get; private set; }

        private KhoaHoc SelectedKhoaHoc
        {
            get
            {
                KhoaHoc khoaHoc = null;
                if (bsKhoaHoc.Current != null)
                    khoaHoc = bsKhoaHoc.Current as KhoaHoc;
                return khoaHoc;
            }
        }

        private CoSoDaoTao SelectedCoSoDaoTao
        {
            get
            {
                CoSoDaoTao coso = null;
                if (bsCoSoDaoTao.Current != null)
                    coso = bsCoSoDaoTao.Current as CoSoDaoTao;
                return coso;
            }
        }

        private LopKhoaNganh SelectedLopKhoaNganh
        {
            get
            {
                LopKhoaNganh lop = null;
                if (bsLopKhoaNganh.Current != null)
                    lop = bsLopKhoaNganh.Current as LopKhoaNganh;
                return lop;
            }
        }

        private HocPhan SelectedHocPhanDuKienMo
        {
            get
            {
                HocPhan hp = null;
                if (bsHocPhanTrongKHDT.Current != null)
                    hp = bsHocPhanTrongKHDT.Current as HocPhan;
                return hp;
            }
        }

        private HocPhan SelectedHocPhanTrongCTDT
        {
            get
            {
                HocPhan hp = null;
                if (bsHocPhanTrongCTDT.Current != null)
                    hp = bsHocPhanTrongCTDT.Current as HocPhan;
                return hp;
            }
        }
        #endregion

        internal void SetHocKy(DAL.Models.HocKy hocKy)
        {
            // Thiết lập học kỳ lập kế hoạch đào tạo
            // -> 
            this.HocKy = hocKy;

            _DoNotLoadDanhSachLopKhoaNganh = true;
            try
            {
                using (var db = CEMS4UG_DHKHContext.GetContext())
                {
                    // 1. Nạp danh sách các Khoá học còn hoạt động trong học kỳ này. Chọn 1 Khoá học mặc định
                    // TODO: CHỈ NẠP NHỮNG KHOÁ HỌC DIỄN RA TRƯỚC HỌC KỲ ĐANG ĐƯỢC CHỌN THÔI!
                    var lstKhoaHoc = BizKhoaHoc.LayDanhSachKhoaHocConHoatDongTrongHocKy(this.HocKy, db);
                    bsKhoaHoc.DataSource = lstKhoaHoc;
                    cbxKhoaHoc.DisplayMember = "TenKhoaHoc";
                    cbxKhoaHoc.DataSource = bsKhoaHoc;

                    // 2. Nạp danh sách các Cơ sở đào tạo
                    bsCoSoDaoTao.DataSource = BizCoSoDaoTao.GetListCoSoDaoTao(db);
                    cbxCoSoDaoTao.DisplayMember = "TenCoSoDaoTao";
                    cbxCoSoDaoTao.DataSource = bsCoSoDaoTao;
                }
            }
            finally
            {
                _DoNotLoadDanhSachLopKhoaNganh = false;
            }

            // Cập nhật GUI theo các lựa chọn mặc định ban đầu.
            NapDanhSachLopKhoaNganh();
        }

        private void UpdateGuiBySelectedLopKhoaNganh()
        {
            _DoNotLoadDanhSachHocPhanDuKien = true;
            try
            {
                var lopKhoaNganh = this.SelectedLopKhoaNganh;
                if (lopKhoaNganh == null)
                {
                    lblDanhSachHocPhanDuKien_Title.Text = "";
                    bsHocPhanTrongKHDT.DataSource = bsHocPhanTrongCTDT.DataSource = null;
                }
                else
                {
                    lblDanhSachHocPhanDuKien_Title.Text = string.Format("Học phần dự kiến giảng dạy cho lớp {0}", lopKhoaNganh.TenLopKhoaNganh);
                    using (var db = CEMS4UG_DHKHContext.GetContext())
                    {
                        var lstHocPhanTrongCTDT = BizDaoTao.getListHocPhanTuChonTrongCTDT(this.HocKy, lopKhoaNganh, true, db);
                        bsHocPhanTrongCTDT.DataSource = lstHocPhanTrongCTDT;
                        var lstHocPhanDuKienMo = BizDaoTao.getListHocPhanTrongKHDT(this.HocKy, lopKhoaNganh, db);
                        bsHocPhanTrongKHDT.DataSource = lstHocPhanDuKienMo;
                    }
                }
                gridHocPhanTrongKHDT.SetDataSource(bsHocPhanTrongKHDT);
                gridHocPhanTuChonTrongCTDT.SetDataSource(bsHocPhanTrongCTDT);
                UpdateGuiBySelectedHocPhanTrongKHDT();
                UpdateGuiBySelectedHocPhanTrongCTDT();
            }
            finally
            {
                _DoNotLoadDanhSachHocPhanDuKien = false;
            }
        }

        public void ChangeHocKy(DAL.Models.HocKy newHocKy)
        {
            this.SetHocKy(newHocKy);
        }

        public UcQuanLyKeHoachDaoTao()
        {
            InitializeComponent();

            gridLopKhoaNganh.SetDataGridViewAsReadonly(rowHeadersVisible: true, columnHeadersVisible: false);
            gridLopKhoaNganh.AddRowIndexing();
            gridHocPhanTrongKHDT.SetDataGridViewAsReadonly(rowHeadersVisible: true, columnHeadersVisible: true);
            gridHocPhanTrongKHDT.AddRowIndexing();
            gridHocPhanTuChonTrongCTDT.SetDataGridViewAsReadonly(rowHeadersVisible: true, columnHeadersVisible: true);
            gridHocPhanTuChonTrongCTDT.AddRowIndexing();
        }

        private void bsLopKhoaNganh_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotLoadDanhSachHocPhanDuKien)
                return;
            UpdateGuiBySelectedLopKhoaNganh();
        }

        private void bsCoSoDaoTao_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotLoadDanhSachLopKhoaNganh)
                return;
            NapDanhSachLopKhoaNganh();
        }

        private void bsKhoaHoc_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotLoadDanhSachLopKhoaNganh)
                return;
            NapDanhSachLopKhoaNganh();
        }

        private void NapDanhSachLopKhoaNganh()
        {
            bsLopKhoaNganh.DataSource = BizDaoTao.GetListLopKhoaNganh(this.SelectedKhoaHoc, this.HocKy, this.SelectedCoSoDaoTao);
            gridLopKhoaNganh.SetDataSource(bsLopKhoaNganh);
            if (_DoNotLoadDanhSachHocPhanDuKien)
                UpdateGuiBySelectedLopKhoaNganh();
        }

        private void btnThemHocPhan_Click(object sender, EventArgs e)
        {
            var lopKhoaNganh = this.SelectedLopKhoaNganh;
            if (lopKhoaNganh == null)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Bạn phải chọn một lớp khoá-ngành trước khi thực hiện chức năng này!");
                return;
            }

            var lstMaHocPhan = new List<string>();
            //var lstChuongTrinhDaoTao_HocPhan = new List<ChuongTrinhDaoTao_HocPhan>();
            foreach (DataGridViewRow row in gridHocPhanTuChonTrongCTDT.Rows)
                if (row.Selected)
                {
                    var x = row.DataBoundItem as ChuongTrinhDaoTao_HocPhan;
                    if (x == null)
                        continue;
                    lstMaHocPhan.Add(x.MaHocPhan);
                    //lstChuongTrinhDaoTao_HocPhan.Add(x);
                }
            if (lstMaHocPhan.Count == 0)
            {
                DialogUtils.ShowMessage("Bạn phải chọn một học phần tự chọn để dự kiến mở");
                return;
            }

            try
            {
                BizDaoTao.BoSungKHDTChoLopKhoaNganh(lopKhoaNganh, this.HocKy, lstMaHocPhan);
                UpdateGuiBySelectedLopKhoaNganh();
                //gridHocPhanTrongKHDT.DataSource = null;
                //gridHocPhanTuChonTrongCTDT.DataSource = null;
                //var lstHocPhanTrongKHDT = bsHocPhanTrongKHDT.DataSource as List<ChuongTrinhDaoTao_HocPhan>;
                //var lstHocPhanTuChonTrongCTDT = bsHocPhanTrongCTDT.DataSource as List<ChuongTrinhDaoTao_HocPhan>;
                //for (int i = 0; i < lstMaHocPhan.Count; i++)
                //{
                //    for (int j = 0; j < lstHocPhanTuChonTrongCTDT.Count; j++)
                //        if (lstHocPhanTuChonTrongCTDT[j].MaHocPhan == lstMaHocPhan[i])
                //        {
                //            lstHocPhanTrongKHDT.Add(lstHocPhanTuChonTrongCTDT[j]);
                //            lstHocPhanTuChonTrongCTDT.RemoveAt(j);
                //            break;
                //        }
                //}
                //bsHocPhanTrongKHDT.DataSource = lstHocPhanTrongKHDT;
                //bsHocPhanTrongCTDT.DataSource = lstHocPhanTuChonTrongCTDT;
                //gridHocPhanTrongKHDT.SetDataSource(bsHocPhanTrongKHDT);
                //gridHocPhanTuChonTrongCTDT.SetDataSource(bsHocPhanTrongCTDT);
            }
            catch (Exception exc)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Không thể bổ sung học phần dự kiến mở cho lớp khoá-ngành {0}!\nChi tiết lỗi: {1}", lopKhoaNganh.TenLopKhoaNganh, exc.Message);
            }
        }

        private void btnHuyHocPhan_Click(object sender, EventArgs e)
        {
            var lopKhoaNganh = this.SelectedLopKhoaNganh;
            if (lopKhoaNganh == null)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Bạn phải chọn một lớp khoá-ngành trước khi thực hiện chức năng này!");
                return;
            }

            var lstMaHocPhan = new List<string>();
            //var lstChuongTrinhDaoTao_HocPhan = new List<ChuongTrinhDaoTao_HocPhan>();
            foreach (DataGridViewRow row in gridHocPhanTrongKHDT.Rows)
                if (row.Selected)
                {
                    var x = row.DataBoundItem as ChuongTrinhDaoTao_HocPhan;
                    if (x == null)
                        continue;
                    if (x.LaHocPhanBatBuoc)
                        continue;
                    lstMaHocPhan.Add(x.MaHocPhan);
                    //lstChuongTrinhDaoTao_HocPhan.Add(x);
                }
            if (lstMaHocPhan.Count == 0)
            {
                DialogUtils.ShowMessage("Bạn phải chọn một học phần tự chọn trong kế hoạch để loại bỏ");
                return;
            }

            try
            {
                BizDaoTao.LoaiBoKHDTHocPhanChoLopKhoaNganh(lopKhoaNganh, this.HocKy, lstMaHocPhan);
                UpdateGuiBySelectedLopKhoaNganh();
                //gridHocPhanTrongKHDT.DataSource = null;
                //gridHocPhanTuChonTrongCTDT.DataSource = null;
                //var lstHocPhanTrongKHDT = bsHocPhanTrongKHDT.DataSource as List<ChuongTrinhDaoTao_HocPhan>;
                //var lstHocPhanTuChonTrongCTDT = bsHocPhanTrongCTDT.DataSource as List<ChuongTrinhDaoTao_HocPhan>;
                //for (int i = 0; i < lstMaHocPhan.Count; i++)
                //{
                //    for (int j = 0; j < lstHocPhanTuChonTrongCTDT.Count; j++)
                //        if (lstHocPhanTuChonTrongCTDT[j].MaHocPhan == lstMaHocPhan[i])
                //        {
                //            lstHocPhanTrongKHDT.Add(lstHocPhanTuChonTrongCTDT[j]);
                //            lstHocPhanTuChonTrongCTDT.RemoveAt(j);
                //            break;
                //        }
                //}
                //bsHocPhanTrongKHDT.DataSource = lstHocPhanTrongKHDT;
                //bsHocPhanTrongCTDT.DataSource = lstHocPhanTuChonTrongCTDT;
                //gridHocPhanTrongKHDT.SetDataSource(bsHocPhanTrongKHDT);
                //gridHocPhanTuChonTrongCTDT.SetDataSource(bsHocPhanTrongCTDT);
            }
            catch (Exception exc)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Không thể loại bỏ học phần trong kế hoạch cho lớp khoá-ngành {0}!\nChi tiết lỗi: {1}", lopKhoaNganh.TenLopKhoaNganh, exc.Message);
            }
        }

        private void gridHocPhanTrongKHDT_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.RowIndex >= 0)
                btnHuyHocPhan_Click(null, null);
        }

        private void gridHocPhanTuChonTrongCTDT_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.RowIndex >= 0)
                btnThemHocPhan_Click(null, null);
        }

        private void bsHocPhanTrongKHDT_CurrentChanged(object sender, EventArgs e)
        {
            UpdateGuiBySelectedHocPhanTrongKHDT();
        }

        private void UpdateGuiBySelectedHocPhanTrongKHDT()
        {
            //var hocPhan = this.SelectedHocPhanDuKienMo;
            //btnHuyHocPhan.Enabled = hocPhan != null && !hocPhan.IsBatBuoc;
        }

        private void UpdateGuiBySelectedHocPhanTrongCTDT()
        {
            //var hocPhan = this.SelectedHocPhanTrongCTDT;
            //btnThemHocPhan.Enabled = hocPhan != null;
        }

        private void bsHocPhanTrongCTDT_CurrentChanged(object sender, EventArgs e)
        {
            UpdateGuiBySelectedHocPhanTrongCTDT();
        }
    }
}
